DockerのscratchイメージでHello Worldする
はじめに
土曜日なので小ネタを書きます。
Amazon EC2 Container Service (ECS): ECSエージェントの動作を確認するで、amazon-ecs-agentはGoで書かれており、ビルドされたバイナリがDockerのscratchイメージで動いていることが分かりました。
今回は、自分でGoバイナリを作成し、Dockerのscratchイメージで動かしてみたいと思います。動かすのは伝統のHello Worldです。
やってみた
環境はAmazon Linux on EC2です。
Go環境のセットアップ
Getting Started - The Go Programming Languageの通り、なのですが、ld-linux.so.2だけは追加でインストールが必要です。
$ sudo yum install ld-linux.so.2
Downloadsページから最新のtarボールを入手し、/usr/local配下に展開します。恒久的に設定する場合はPATHをprofileなりbashrcなりに書いて下さい。
$ wget https://storage.googleapis.com/golang/go1.4.linux-386.tar.gz $ sudo tar -C /usr/local -xzf go1.4.linux-386.tar.gz $ export PATH=$PATH:/usr/local/go/bin $ which go /usr/local/go/bin/go
Goバイナリの作成
作業用ディレクトリを作り、Hello WorldするGoプログラムを書きます。
$ mkdir hello;cd hello $ vi hello.go package main import "fmt" func main() { fmt.Printf("Hello, World\n") }
そしてビルドし、バイナリを作成します。
$ go build hello.go $ ls hello hello.go
バイナリを実行すると"Hello, World"と帰ってきます。
$ ./hello Hello, World
Dockerイメージを作成する
Dockerfileを書きます。scratchイメージをFROMとし、先ほど作成したhelloを組み込みます。
$ vi Dockerfile FROM scratch COPY ./hello /hello CMD ["/hello"]
docker buildします。
$ sudo docker build -t local/hello . Sending build context to Docker daemon 1.564 MB Sending build context to Docker daemon Step 0 : FROM scratch ---> 511136ea3c5a Step 1 : COPY ./hello /hello ---> a3c0b4115aa1 Removing intermediate container 222d142413e5 Step 2 : CMD /hello ---> Running in 5b61c49f4af4 ---> 70da0ed0ca59 Removing intermediate container 5b61c49f4af4 Successfully built 70da0ed0ca59
Dcokerイメージが作成されたことを確認します。
$ sudo docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE local/hello latest 70da0ed0ca59 14 minutes ago 1.56 MB
Dockerコンテナを起動する
では作成したlocal/helloを起動します。
$ sudo docker run local/hello Hello, World
はい、Hellow Worldされました!
まとめ
scratchの用途がイメージ出来ました。scratchは超最小イメージなので複数ファイルで構成されるようなアプリケーションは手間がかかりそうですが、バイナリ一つで動かせるようなアプリケーションだと重宝しそうです。